﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace AktionServer
{
    public class Skeleton
    {
        private Socket klient;		// socket til klient
        private Produkt produkt;
        private Monitor monitor;
        private NetworkStream networkstream;
        private StreamReader streamreader;
        private StreamWriter streamwriter;

        // Konstruktør som får socket til klient med som parameter
        public Skeleton(Socket klient, Produkt produkt, Monitor monitor)
        {
            this.klient = klient;
            this.produkt = produkt;
            this.monitor = monitor;

            networkstream = new NetworkStream(klient);
            streamreader = new StreamReader(networkstream);
            streamwriter = new StreamWriter(networkstream);
        }

        string data, navn, beskrivelse, billed, varensStand, sidsteBud1;
        int varenr;
        decimal mindstePris, klientsSidsteBud, sidsteBud;

        // Tråd-metode som kommunikerer med en klient
        public void UdfoerBud()
        {
            try
            {
                data = streamreader.ReadLine();					// Læs kommando

                // Udfør kommando
                if (data == "HentNavn")
                {
                    navn = produkt.Navn;
                    streamwriter.WriteLine(navn);
                    streamwriter.Flush();
                }
                else if (data == "HentBeskrivelse")
                {
                    beskrivelse = produkt.Beskrivelse;
                    streamwriter.WriteLine(beskrivelse);
                    streamwriter.Flush();
                }

                else if (data == "HentVarestand")
                {
                    varensStand = produkt.VarensStand;
                    streamwriter.WriteLine(varensStand);
                    streamwriter.Flush();
                }

                else if (data == "HentBilled")
                {
                    billed = produkt.Billede;
                    streamwriter.WriteLine(billed);
                    streamwriter.Flush();
                }
                else if (data == "HentMindstePris")
                {
                    mindstePris = produkt.MindstePris;
                    streamwriter.WriteLine(decimal.Parse(mindstePris.ToString()));
                    streamwriter.Flush();
                }
                else if (data == "HentVareNr")
                {
                    varenr = produkt.Varenr;
                    streamwriter.WriteLine(int.Parse(varenr.ToString()));
                    streamwriter.Flush();
                }
                else if (data == "Byd")
                {
                    decimal buddet = decimal.Parse(streamreader.ReadLine());
                        produkt.SidsteBud = buddet;
                        streamwriter.WriteLine(buddet);
                        streamwriter.Flush();
                }
                else if (data == "HentSidsteBud")
                {
                    sidsteBud = produkt.SidsteBud;
                    streamwriter.WriteLine(sidsteBud);
                    streamwriter.Flush();
                }
            }
            catch (IOException e)		// Fejl i kommunikation
            {
                Console.WriteLine("Fejl i data eller kommunikation...\n");
                Console.WriteLine(e.ToString());

                Console.WriteLine("Forbindelse til klient lukkes ned...\n");
                streamwriter.Close();
                streamreader.Close();
                networkstream.Close();
            }

        }

        public void HaandterKlient()
        {
            try
            {
                string klientIPadresse;

                IPAddress klientIPAdress = ((IPEndPoint)this.klient.RemoteEndPoint).Address;
                klientIPadresse = klientIPAdress.ToString();
                IPHostEntry ip = Dns.GetHostEntry(klientIPAdress);
                Thread.CurrentThread.Name = ip.HostName;

                this.monitor.AddStreamWriter(streamwriter);	// tilføj streamwriter til monitor

                // Broadcast besked om logon til de andre klienter										
                this.monitor.BroadcastChat(sidsteBud1);

                while (true)      // sålænge der kommunikeres med klient
                {
                    sidsteBud1 = streamreader.ReadLine();  // Læs chat fra klient
                    //if (sidsteBud == null)
                    //    break;

                    // Broadcast chat til de andre klienter										
                    monitor.BroadcastChat(sidsteBud1);
                }

                // fjern streamwriter fra monitor
                monitor.RemoveStreamWriter(streamwriter);

                // Broadcast besked om logoff til de andre klienter										
                //   monitor.BroadcastChat(klientIPadresse, "logged off");

                Console.WriteLine("Forbindelse til klient lukkes ned...\n");
                streamwriter.Close();
                streamreader.Close();
                networkstream.Close();
            }
            catch (IOException ex) { }
        }
    }
}
